home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
amiga
/
gui
/
prcgntn1.lha
/
Precognition
/
source
/
PObject.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-23
|
3KB
|
148 lines
/* ==========================================================================
**
** PObject.c
**
** ⌐1991 WILLISoft
**
** ==========================================================================
*/
#include <exec/types.h>
#include "PObject.h"
#include "PObjectClass.h"
#include "stdlib.h"
#include "AmigaMem.h"
void SetObjectName( PObject *self, char *name );
#ifdef VERBOSE
void DumpClassChain( struct PObjectClass *class )
{
for( ; class!=NULL; class=class->isa )
{
printf("%s", class->ClassName );
if (class->isa) printf("->");
}
printf("\n");
}
#endif
void PObject_CleanUp( PObject *self )
{
SetObjectName( self, NULL );
}
void CleanUp( PObject *self )
{
struct PObjectClass *class;
void *prev_cleaner = NULL;
if (self)
{
/* call cleanup routines for entire parent hierarchy. */
for (class = (struct PObjectClass *) self->isa;
class != NULL;
class = class->isa )
{
if (class->CleanUp)
{
if ((void*) class->CleanUp != prev_cleaner)
{
(*class->CleanUp)( self );
prev_cleaner = (void*) class->CleanUp;
}
}
}
}
}
const char *ClassName( const PObject *self )
{
struct PObjectClass *class;
char *name = NULL;
if (self)
if (class = (struct PObjectClass *) self->isa)
name = class->ClassName;
return name;
}
BOOL isa( const PObject *self,
const Class *class )
{
struct PObjectClass *self_class;
struct PObjectClass *c;
c = (struct PObjectClass *) class;
if (self)
{
/* Traverse inheritence tree of self. */
for ( self_class = self->isa;
self_class != NULL;
self_class = self_class->isa )
{
/*printf("isa(\"%s\", \"%s\")\n",*/
/* self_class->ClassName, c->ClassName );*/
if (self_class->ClassName == c->ClassName)
{
/*printf("Match!\n");*/
return TRUE;
} }
}
/*printf("No Match.\n");*/
return FALSE;
}
char *ObjectName( PObject *self )
{
if (self) return self->PObjectName;
return NULL;
}
char *PObjectName( PObject *self ) { return ObjectName(self); }
void SetObjectName( PObject *self, char *name )
{
if (self == NULL) return;
Afree( self->PObjectName );
self->PObjectName = Astrdup(name);
}
BOOL PObject_elaborated = FALSE;
struct PObjectClass PObject_Class;
void PObjectClass_Init( struct PObjectClass *class )
{
class->isa = NULL;
class->ClassName = "PObject";
class->CleanUp = PObject_CleanUp;
}
const struct PObjectClass *PObjectClass( void )
{
if (! PObject_elaborated)
{
PObjectClass_Init( &PObject_Class );
PObject_elaborated = TRUE;
}
return &PObject_Class;
}
void PObject_Init( PObject *self )
{
self->isa = PObjectClass();
self->PObjectName = NULL;
}